package cn.itsource.random;

import java.util.concurrent.ThreadLocalRandom;

/**
 *	验证码：
 */
public class IdentifyingCode {

	public static void main(String[] args) {
		//验证方法
		String identifyingCode = getIdentifyingCode(6);
		System.out.println(identifyingCode);
	}
	
	/**
	 * 需求：请从字符串 	0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm	中，
	 * 	生成一个n位的随机数验证码字符串，并且将验证码字符串返回
	 * 建议去掉：O o 0 1 l I
	 * 
	 * 思路：
	 * 		这是一个方法：返回值String，参数 int n 表示生成的验证码位数
	 * 	大概的思路：遍历n次，从当前字符串中取出字符，拼接到一起，最后返回
	 * 		1. 为了方便遍历，就将字符串转换为char[]
	 * 		2. 准备一个String 对象，准备进行字符串拼接的
	 * 		3. 先定义一个获取随机数方法
	 * 		4. 遍历n次char数组,每一次遍历，调用一次随机数方法获取数组下标（[0,62)），然后拼接通过下标
	 * 		获取的char数组元素
	 * 		5. 在遍历完毕后，将字符串验证码返回
	 */
	public static String getIdentifyingCode(int n) {
		//1. 为了方便遍历，就将字符串转换为char[]
		String str = "0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
		
		//将字符串转换为数组方法
		char[] charArray = str.toCharArray();
		
		//2. 准备一个String 对象，准备进行字符串拼接的
		String code = "";
		
		//4.遍历n次char数组,每一次遍历，调用一次随机数方法获取数组下标（[0,62)），然后拼接通过下标获取的char数组元素
		for (int i = 1; i <= n; i++) {//因为随机数是n位，所以要循环获取n次
			//调用随机方法，获取指定范围的下标
			int index = getRandom(0, charArray.length);//范围是：[0-当前char数组的长度)
			//通过随机下标获取一个元素
			char c = charArray[index];
			//拼接字符串
			code += c;
		}
		//5. 在遍历完毕后，将字符串验证码返回
		return code;
	}
	
	/**
	 * 3. 先定义一个获取随机数方法
	 * 获取随机数方法范围：[start,end)
	 * @param start	开始
	 * @param end	结束（取不到）
	 * @return
	 * 
	 */
	public static int getRandom(int start,int end) {
		//获取ThreadLocalRandom对象
		ThreadLocalRandom current = ThreadLocalRandom.current();
		
		//调用方法获取指定范围的随机数
		int nextInt = current.nextInt(start, end);
		return nextInt;
	}
}
